package com.jiezuo.flowable.service;

import com.alibaba.fastjson.JSONArray;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.jiezuo.common.vo.PageVo;
import com.jiezuo.common.vo.Result;
import com.jiezuo.flowable.entity.*;
import org.flowable.engine.runtime.Execution;
import org.flowable.engine.task.Comment;

import java.util.*;

/**
 * @description 流程任务
 * @author 庞留杰
 * @date 2020/9/11 18:01
 * @version V1.0
 **/
public interface UserTaskService {

    /**
     * 我的待办
     */
    Page backlog(PageVo pageVo, TaskBacklogQuery backlogQuery);

    /**
     * 功能描述: 查询申请（查询我发起的流程实例）【对应表：act_hi_procinst 历史的流程实例表】
     */
    Page doingPage(PageVo pageVo, TaskDoingQuery taskDoingQuery);

    /**
     * 根据用户ID或者用户组ID，查询该用户代办，查询该用户代办数量
     * */
    long count(String userId, List<String> groupIds);

    /**
     * 根据用户ID或者用户组ID，查询该用户待办
     * */
    Page todoPage(PageVo pageVo, TaskToDoQuery query);

    /**
     * 功能描述: 查询已办任务【对应表：act_hi_taskinst】
     */
    Page donePage(PageVo pageVo, TaskDoneQuery taskDoneQuery);

    /**
     * 执行任务
     * */
    Map<String, Object> executeTask(TaskExecuteQuery taskExecuteQuery);

    /**
     * 查询任务
     * */
    JSONArray findTask(TaskListQuery taskListQuery);

    /**
     * @return
     * @description 添加备注信息
     */
    Result addComments(CommentAddQuery commentAddQuery);

    /**
     * @description 添加备注信息 （不需要taskId）
     **/
    void addComments2(CommentAddQuery commentAddQuery);

    void addComments3(CommentAddQuery commentAddQuery);

    /**
     * @description 查询备注信息
     **/
    List<Comment> findCommentList(String processInstanceId);

    /**
     * 功能描述: 获取所有可回退的节点
     */
    Map<String, Object> getFallbackNode(String processInstanceId);

    /**
     * 功能描述: 获取所有可回退的节点
     *          规则：
     *          1.从历史获取所有审批过的节点信息
     *          2.通过开始时间排序，去除历史中重复的节点
     */
    Map<String, Object> getFallbackNode2(String processInstanceId);

    /**
     * 功能描述: 获取所有可回退的节点
     *          规则：
     *              从历史获取所有审批过的节点信息
     *              带分页
     */
    Map<String, Object> getFallbackNode3(String processInstanceId, PageVo pageVo);

    Map<String, Object> getFallbackNode4(String processInstanceId, String taskId, PageVo pageVo);

    /**
     * 功能描述: 任务撤回【注意：当前与目标定义Key为设计模板时任务对应的ID(通常格式：sid-xxxxxxxxxxxxxxxxx),而非数据主键ID】
     */
    void withdraw(TaskFallbackQuery taskFallbackQuery);

    /**
     * 功能描述: 退回上一步，注意只能回退一步【例： 当前在“第三步”：
     *                              调用一次，回退到“第二步”，
     *                              再次调用，回退到“第三步”，
     *                              再次调用，回退到“第二步”，
     *                                以此类推。。。。
     *           】
     */
    Map<String, String> rollback(String processInstanceId);

    Map<String, String> rollback2(Map<String, Object> map);

    /**
     * 功能描述: 依次向前回退【例： 当前在“第三步”：
     *                              调用一次，回退到“第二步”，
     *                              再次调用，回退到“第一步”，
     *           】
     */
    Map<String, String> rollback3(String processInstanceId);

    Map<String, String> rollback4(String processInstanceId, String taskId);

    Map<String, String> rollback5(Map<String, String> map);

    /**
     * 功能描述: 审批历史记录, 查看任务执行的详情【对应表：act_hi_actinst历史节点表】
     */
    Page records(PageVo pageVo, String processInstanceId, String executionId);

    String getTaskIdByProcessInstanceId(String processInstanceId);

    Execution addMultiInstance(Map map);

    void deleteMultiInstance(Map map);

    boolean isCompletedByProcessInstanceId(String processInstanceId);
}
